using UnityEngine;
using UnityEngine.UI;
using EnhancedUI.EnhancedScroller;
namespace EnhancedScrollerDemos.SelectionDemo
{
///
/// This delegate handles the UI's button click
///
/// The cell view that had the button click
public delegate void SelectedDelegate(EnhancedScrollerCellView cellView);
///
/// This class handles the presentation of the inventory cell view. Both the
/// horizontal and vertical cell views share the same view class. The difference
/// between them is layout and sprite for this example.
///
public class InventoryCellView : EnhancedScrollerCellView
{
///
/// Reference to the underlying data driving this view
///
private InventoryData _data;
///
/// These are the UI elements that will be updated when the data changes
///
public Image selectionPanel;
public Text itemNameText;
public Text itemCostText;
public Text itemDamageText;
public Text itemDefenseText;
public Text itemWeightText;
public Text itemDescriptionText;
public Image image;
///
/// These are the colors for the selection of the cells
///
public Color selectedColor;
public Color unSelectedColor;
///
/// Public reference to the index of the data
///
public int DataIndex { get; private set; }
///
/// The handler to call when this cell's button traps a click event
///
public SelectedDelegate selected;
///
/// This is called if the cell is destroyed. The EnhancedScroller will
/// not call this since it uses recycling, but we include it in case
/// the user decides to destroy the cell anyway
///
void OnDestroy()
{
if (_data != null)
{
// remove the handler from the data so
// that any changes to the data won't try
// to call this destroyed view's function
_data.selectedChanged -= SelectedChanged;
}
}
///
/// This function sets up the data for the cell view
///
/// The index of the data
/// The data to use
/// Whether this view is vertical or horizontal (which will determine the sprite to use)
public void SetData(int dataIndex, InventoryData data, bool isVertical)
{
// if there was previous data assigned to this cell view,
// we need to remove the handler for the selection change
if (_data != null)
{
_data.selectedChanged -= SelectedChanged;
}
// link the data to the cell view
DataIndex = dataIndex;
_data = data;
// update the cell view's UI
itemNameText.text = data.itemName;
if (itemCostText != null) itemCostText.text = (data.itemCost > 0 ? data.itemCost.ToString() : "-");
if (itemDamageText != null) itemDamageText.text = (data.itemDamage > 0 ? data.itemDamage.ToString() : "-");
if (itemDefenseText != null) itemDefenseText.text = (data.itemDefense > 0 ? data.itemDefense.ToString() : "-");
if (itemWeightText != null) itemWeightText.text = (data.itemWeight > 0 ? data.itemWeight.ToString() : "-");
// the description is only shown on the vertical cell view
if (isVertical)
itemDescriptionText.text = data.itemDescription;
// set up the sprite based on the sprite path and whether the
// view is horizontal or vertical
image.sprite = Resources.Load(data.spritePath + (isVertical ? "_v" : "_h"));
// set up a handler so that when the data changes
// the cell view will update accordingly. We only
// want a single handler for this cell view, so
// first we remove any previous handlers before
// adding the new one
_data.selectedChanged -= SelectedChanged;
_data.selectedChanged += SelectedChanged;
// update the selection state UI
SelectedChanged(data.Selected);
}
///
/// This function changes the UI state when the item is
/// selected or unselected.
///
/// The selection state of the cell
private void SelectedChanged(bool selected)
{
selectionPanel.color = (selected ? selectedColor : unSelectedColor);
}
///
/// This function is called by the cell's button click event
///
public void OnSelected()
{
// if a handler exists for this cell, then
// call it.
if (selected != null) selected(this);
}
}
}